/**
 * Operator.java
 *
 * @author: ZhuJiahui
 * @date: 2018/12/23 22:38
 */
package com.zhujiahui.spring.aop.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @description:
 * @author: ZhuJiahui
 * @version: 1.0
 */
@Component
@Aspect
public class Operator {
    // 第一个*表示匹配任意的方法返回值，..(两个点)表示零个或多个，
    // 上面的第一个..表示service包及其子包,
    // 第二个*表示所有类,第三个*表示所有方法，
    // 第二个..表示方法的任意参数个数

    // @Pointcut("within(com.aijava.springcode.service.*)")
    //within限定匹配方法的连接点,上面的就是表示匹配service包下的任意连接点

    // @Pointcut("this(com.aijava.springcode.service.UserService)")
    // this用来限定AOP代理必须是指定类型的实例，如上，指定了一个特定的实例，就是UserService

    // @Pointcut("bean(userService)")
    // bean也是非常常用的,bean可以指定IOC容器中的bean的名称

    @Pointcut("execution(* com.zhujiahui.spring.aop..*.*(..))")
    public void pointCut() {
    }

    @Before("pointCut()")
    public void doBefore(JoinPoint joinPoint) {
        System.out.println("AOP Before Advice...");
    }

    @After("pointCut()")
    public void doAfter(JoinPoint joinPoint) {
        System.out.println("AOP After Advice...");
    }

    @AfterReturning(pointcut = "pointCut()", returning = "returnVal")
    public void afterReturn(JoinPoint joinPoint, Object returnVal) {
        System.out.println("AOP AfterReturning Advice:" + returnVal);
    }

    @AfterThrowing(pointcut = "pointCut()", throwing = "error")
    public void afterThrowing(JoinPoint joinPoint, Throwable error) {
        System.out.println("AOP AfterThrowing Advice..." + error);
        System.out.println("AfterThrowing...");
    }

    @Around("pointCut()")
    public void around(ProceedingJoinPoint pjp) {
        System.out.println("AOP Aronud before...");
        try {
            pjp.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("AOP Aronud after...");
    }
}
